﻿using System;
using System.ComponentModel;
using System.Data;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using LayerEntity.Caja;
using LayerEntity.Hotel;
using LayerEntity.Sistema;
using LayerLogic;

namespace System2012.Caja
{
    public partial class frmCaja : DevExpress.XtraEditors.XtraForm
    { /// <summary>
        /// Indica si estamos editanado o creando uno Nuevo
        /// 0: Nuevo Documento
        /// 1: Editando y Guardando
        /// </summary>
        int operacion = 0;
        /// <summary>
        /// metodos y funciones globales de ayuda del sistema
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        GUtil util = new GUtil();
        /// <summary>
        /// 
        /// </summary>
        DataTable dtbC = new DataTable();
        public frmCaja()
        {
            this.InitializeComponent();
            this.RecControles(this);
        }

        #region DESPLAZAMIENTOS
        private void PresionadoTeclas(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Down)
            {
                if (sender == this.txtId)
                {
                    this.txtNombre.Focus();
                }
                if (sender == this.txtNombre)
                {
                    this.txtNroCuenta.Focus();
                }

                if (sender == this.txtNroCuenta)
                {
                    this.cmbTipoCaja.Focus();
                }
                
                if (this.cmbEmpresa == this.txtId)
                {
                    this.cmbSucursal.Focus();
                }
                
                if (sender == this.chkContado)
                {
                    this.chkCredito.Focus();
                }
                if (sender == this.chkCredito)
                {
                    this.chkPagoProveedores.Focus();
                }
                if (sender == this.chkPagoProveedores)
                {
                    this.chkCobranzaliente.Focus();
                }
                if (sender == this.chkCobranzaliente)
                {
                    this.cmbEstado.Focus();
                }
            }
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Right)
            {
                if (sender == this.cmbTipoCaja)
                {
                    this.cmbMoneda.Focus();
                }
                if (sender == this.cmbMoneda)
                {
                    this.cmbEmpresa.Focus();
                }
                if (sender == this.cmbEmpresa)
                {
                    this.cmbSucursal.Focus();
                }
                if (sender == this.cmbSucursal)
                {
                    this.chkContado.Focus();
                }
            }
            if (e.KeyCode == Keys.Up)
            {
                if (sender == this.txtNombre)
                {
                    this.txtId.Focus();
                }
                if (sender == this.txtNroCuenta)
                {
                    this.txtNombre.Focus();
                }

                if (sender == this.chkContado)
                {
                    this.cmbSucursal.Focus();
                }

                if (sender == this.chkCredito)
                {
                    this.chkContado.Focus();
                }
                if (sender == this.chkPagoProveedores)
                {
                    this.chkCredito.Focus();
                }
                if (sender == this.chkCobranzaliente)
                {
                    this.chkPagoProveedores.Focus();
                }
            }
            if (e.KeyCode == Keys.Left)
            {
                if (sender == this.cmbTipoCaja)
                {
                    this.txtNroCuenta.Focus();
                }
                if (sender == this.cmbMoneda)
                {
                    this.cmbTipoCaja.Focus();
                }
                if (sender == this.cmbEmpresa)
                {
                    this.cmbMoneda.Focus();
                }
                if (this.cmbEmpresa == this.cmbSucursal)
                {
                    this.txtId.Focus();
                }
                if (sender == this.cmbEstado)
                {
                    this.chkCobranzaliente.Focus();
                }
            }
        }

        public void RecControles(Control control)
        {
            //Recorremos con un ciclo for each cada control que hay en la colección Controls
            foreach (Control contHijo in control.Controls)
            {
                //Preguntamos si el control tiene uno o mas controles dentro del mismo con la propiedad 'HasChildren'
                //Si el control tiene 1 o más controles, entonces llamamos al procedimiento de forma recursiva, para que siga recorriendo los demás controles 
                if (contHijo.HasChildren)
                {
                    this.RecControles(contHijo);
                }
                //Aqui va la lógica de lo queramos hacer, en mi ejemplo, voy a pintar de color azul el fondo de todos los controles
                // Asignamos el Evento para los desplazamientos de los controles
                contHijo.KeyDown += new KeyEventHandler(PresionadoTeclas);
            }
        }

        #endregion
        #region METODOS
        private void Editar(int index)
        {
            this.txtId.Text = this.dtbC.Rows[index]["id_caja"].ToString();
            this.txtNombre.Text = this.dtbC.Rows[index]["nombre"].ToString();
            this.txtNroCuenta.Text = this.dtbC.Rows[index]["nro_cuenta"].ToString();
            this.chkCredito.Checked = this.dtbC.Rows[index]["venta_credito"].ToString() == "S" ? true : false;
            this.chkContado.Checked = this.dtbC.Rows[index]["venta_contado"].ToString() == "S" ? true : false;
            this.chkPagoProveedores.Checked = this.dtbC.Rows[index]["pago_proveed"].ToString() == "S" ? true : false;
            this.chkCobranzaliente.Checked = this.dtbC.Rows[index]["cobranzas"].ToString() == "S" ? true : false; 
            this.cmbTipoCaja.EditValue = int.Parse(this.dtbC.Rows[index]["id_tipcaja"].ToString());
            this.cmbMoneda.EditValue = int.Parse(this.dtbC.Rows[index]["id_moneda"].ToString());
            this.cmbEmpresa.EditValue = int.Parse(this.dtbC.Rows[index]["id_empresa"].ToString());
            this.cmbSucursal.EditValue = int.Parse(this.dtbC.Rows[index]["id_sucursal"].ToString());
            this.cmbEstado.EditValue = int.Parse(this.dtbC.Rows[index]["id_estado"].ToString());
            this.rdbCaja.Checked = this.dtbC.Rows[index]["caja_banco"].ToString() == "C" ? true : false;
            this.rdbBanco.Checked = this.dtbC.Rows[index]["caja_banco"].ToString() == "B" ? true : false;
            this.operacion = 1;
        }
        
        private void NuevaCaja()
        {
            this.txtNombre.Focus();
            this.txtId.Text = "0";
            this.txtNombre.Text = "";
            this.txtNroCuenta.Text = "";
            this.chkCredito.Checked = false;
            this.chkContado.Checked = false;
            this.chkPagoProveedores.Checked = false;
            this.chkCobranzaliente.Checked = false;
            this.cmbTipoCaja.EditValue = null;
            this.cmbMoneda.EditValue = null;
            this.cmbEmpresa.EditValue = null;
            this.cmbSucursal.EditValue = null;
            this.cmbEstado.EditValue = null;
            this.operacion = 0;
        }

        private bool validar()
        {
            bool res = false;
            if (this.txtNombre.Text == string.Empty)
            {
                res = false;
                XtraMessageBox.Show(this, "INGRESE LA DENOMINACION DE LA CAJA", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.txtNombre.Focus();
                this.txtNombre.SelectAll();
            }
            else
            {
                if (this.cmbTipoCaja.ItemIndex == -1)
                {
                    res = false;
                    XtraMessageBox.Show(this, "DEBE DE SELECCIONAR EL TIPO DE CAJA", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.cmbTipoCaja.Focus();
                    this.cmbTipoCaja.SelectAll();
                }
                else
                {
                    if (this.cmbMoneda.ItemIndex == -1)
                    {
                        res = false;
                        XtraMessageBox.Show(this, "DEBE DE SELECCIONAR LA MONEDA", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.cmbMoneda.Focus();
                        this.cmbMoneda.SelectAll();
                    }
                    else
                    {
                        if (this.cmbEmpresa.ItemIndex == -1)
                        {
                            res = false;
                            XtraMessageBox.Show(this, "SELECCIONE A LA EMPRESA QUE PERTENECE", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            this.cmbEmpresa.Focus();
                            this.cmbEmpresa.SelectAll();
                        }
                        else
                        {
                            if (this.cmbSucursal.ItemIndex == -1)
                            {
                                res = false;
                                XtraMessageBox.Show(this, "DEBE DE SELECCIONAR A LA SUCRUSAL QUE PERTENECE", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                this.cmbSucursal.Focus();
                                this.cmbSucursal.SelectAll();
                            }
                            else
                            {
                                if (this.cmbEstado.ItemIndex == -1)
                                {
                                    res = false;
                                    XtraMessageBox.Show(this, "DEBE DE SELECCIONAR EL ESTADO", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    this.cmbEstado.Focus();
                                    this.cmbEstado.SelectAll();
                                }
                                else
                                {
                                    res = true;
                                }
                            }
                        }
                    }
                }
            }

            return res;
        }

        private void Grabar()
        {
            ECaja objC = new ECaja();
            objC.Id_Caja = int.Parse(this.txtId.Text);
            objC.nombre = this.txtNombre.Text;
            objC.Id_Estado = int.Parse(this.cmbEstado.EditValue.ToString());
            objC.venta_credito = this.chkCredito.Checked ? "S" : "N";
            objC.venta_contado = this.chkContado.Checked ? "S" : "N";
            objC.pago_proveed = this.chkPagoProveedores.Checked ? "S" : "N";
            objC.cobranzas = this.chkCobranzaliente.Checked ? "S" : "N";
            objC.id_tipcaja = int.Parse(this.cmbTipoCaja.EditValue.ToString());
            objC.Id_Moneda = int.Parse(this.cmbMoneda.EditValue.ToString());
            objC.caja_banco = "";
            objC.nro_cuenta = this.txtNroCuenta.Text;
            objC.IdUsuario = "";
            objC.caja_banco = this.rdbCaja.Checked ? "C" : "B";
            objC.Id_Sucursal = int.Parse(this.cmbSucursal.EditValue.ToString());
            string resultado = System2012.SystemUtils.RecordmanagerCaja.MantenimientoCajas(objC, this.operacion == 0 ? EnumOperaciones.Insertar : EnumOperaciones.Actualizar);
            if (resultado == "0")
            {
                XtraMessageBox.Show(this, "PROCESO EFECTUADO CON EXITO", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.None);
            }
            else
            {
                if (resultado == "-1")
                {
                    XtraMessageBox.Show(this, "INCONSISTENCIA INESPERADA \n NO SE REALIZO NINGUNA OPERACIÓN", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    if (resultado == "-2")
                    {
                        XtraMessageBox.Show(this, "EL NOMBRE DE LA CAJA  YA EXISTE", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        if (resultado == "-3")
                        {
                            XtraMessageBox.Show(this, "SELECCIONE CORRECTAMENTE LA SUCURSAL", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else
                        {
                            if (resultado == "-4")
                            {
                                XtraMessageBox.Show(this, "INCONSISTENCIA INESPERADA \n NO SE REALIZO NINGUNA CTUALIZACION", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                            else
                            {
                                if (resultado == "5")
                                {
                                    XtraMessageBox.Show(this, "NO HA SELECCIONADO NINGUN REGISTRO\n PARA REALIAR ESTE\n PROCESO INTENTE NUEVAMENTE", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                }
                                else
                                {
                                    XtraMessageBox.Show(this, resultado);
                                }
                            }
                        }
                    }
                }
            }
            if (!this.BGEListCaja.IsBusy)
            {
                this.BGEListCaja.RunWorkerAsync();
            }
        }

        #endregion
        private void BGWMoneda_DoWork(object sender, DoWorkEventArgs e)
        {
            this.BGWMoneda.ReportProgress(30, "Cargando lista de Precios");
            e.Result = SystemUtils.RecordManagerCommonList.GetMoneda();
            this.BGWMoneda.ReportProgress(100, "Completado");
        }

        private void BGWMoneda_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.cmbMoneda.Properties.DataSource = e.Result;
            if (!this.BGWEmpresa.IsBusy)
            {
                this.BGWEmpresa.RunWorkerAsync();
            }
        }

        private void frmCaja_Load(object sender, EventArgs e)
        {
            if (!this.BGEListCaja.IsBusy)
            {
                this.BGEListCaja.RunWorkerAsync();
            }
        }

        private void BGWEmpresa_DoWork(object sender, DoWorkEventArgs e)
        {
            e.Result = System2012.SystemUtils.RecordManagerCommonList.GetEmpresas();
        }

        private void BGWEmpresa_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.cmbEmpresa.Properties.DataSource = e.Result;
        }

        private void BGWSucursal_DoWork(object sender, DoWorkEventArgs e)
        {
            if (this.cmbEmpresa.EditValue != null)
            {
                EHotel obj = new EHotel();
                obj.Condicion = string.Format("where id_empresa={0}", this.cmbEmpresa.EditValue.ToString());
                e.Result = System2012.SystemUtils.RecordManagerCommonList.GetListaSucursal(obj);
            }
        }

        private void BGWSucursal_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.cmbSucursal.Properties.DataSource = e.Result;
            if (!this.BGWEstado.IsBusy)
            {
                this.BGWEstado.RunWorkerAsync();
            }
        }

        private void cmbEmpresa_EditValueChanged(object sender, EventArgs e)
        {
            if (!this.BGWSucursal.IsBusy)
            {
                this.BGWSucursal.RunWorkerAsync();
            }
        }

        private void BGWEstado_DoWork(object sender, DoWorkEventArgs e)
        {
            this.BGWEstado.ReportProgress(30, "Cargando Estado");
            e.Result = SystemUtils.RecordManagerCommonList.GetEstados();
            this.BGWEstado.ReportProgress(100, "Completado");
        }

        private void BGWEstado_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.cmbEstado.Properties.DataSource = e.Result;
        }

        private void BGWTipCaja_DoWork(object sender, DoWorkEventArgs e)
        {
            ESistema obj = new ESistema();
            obj.Condicion = "";
            e.Result = System2012.SystemUtils.RecordmanagerCaja.GetListaTipCaja(obj);
        }

        private void BGWTipCaja_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.cmbTipoCaja.Properties.DataSource = e.Result;
            if (!this.BGWMoneda.IsBusy)
            {
                this.BGWMoneda.RunWorkerAsync();
            }
        }

        private void barManager1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if ((string)e.Item.Tag == "Nuevo")
            {
                this.NuevaCaja();
            }
            if ((string)e.Item.Tag == "Grabar")
            {
                if (this.validar() == true)
                {
                    this.Grabar();
                }
            }
        }

        private void BGEListCaja_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.dtbC = (DataTable)e.Result;
            this.gridControl1.DataSource = e.Result;
            if (!this.BGWTipCaja.IsBusy)
            {
                this.BGWTipCaja.RunWorkerAsync();
            }
        }

        private void BGEListCaja_DoWork(object sender, DoWorkEventArgs e)
        {
            ECaja objC = new ECaja();
            objC.Condicion = string.Format("where nombre ILIKE '%{0}%'", this.txtFiltroCaja.Text);
            e.Result = System2012.SystemUtils.RecordmanagerCaja.GetListaCaja(objC);
        }

        private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
        {
            this.Editar(e.RowHandle);
        }

        private void txtFiltroCaja_TextChanged(object sender, EventArgs e)
        {
            if (!this.BGEListCaja.IsBusy)
            {
                this.BGEListCaja.RunWorkerAsync();
            }
        }

        private void frmCaja_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.S && (e.Control || e.Alt || e.Shift))
            {
                if (this.validar() == true)
                {
                    this.Grabar();
                }
            }
            if (e.KeyCode == Keys.N && (e.Control || e.Alt || e.Shift))
            {
                this.NuevaCaja();
            }

            if (e.KeyCode == Keys.F && (e.Control || e.Alt || e.Shift))
            {
                this.txtFiltroCaja.Focus();
            }
            if (e.KeyCode == Keys.B && (e.Control || e.Alt || e.Shift))
            {
                this.txtFiltroCaja.Focus();
            }
            if (e.KeyCode == Keys.W && (e.Control || e.Alt || e.Shift))
            {
                this.Close();
            }

            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }

        private void btnGrabar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
        }

        private void barButtonItem4_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            //  Console.Write(rdbTipoCaja.GETI);
        }

        private void btnNuevo_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
        }
    }
}